package com.atguigu.tingshu.search.config;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author atguigu-mqx
 * @ClassName ThreadPoolExecutorConfig
 * @description: TODO
 * @date 2025年04月14日
 * @version: 1.0
 */
@Component
public class ThreadPoolExecutorConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(){
        //  自定义线程池：为什么不能使用工具类创建的线程池? 因为它的阻塞队列或最大线程个数默认值是Integer.MAX_VALUE;
        //  线程池的核心参数; 核心个数如何设置 io:2n cpu:n+1 n:服务器的cpu 核数; 线程池工作原理; 相关源码;
        //  获取系统cpu 核数
        int cpuCoreNum = Runtime.getRuntime().availableProcessors();
        System.out.println("cpu核数："+cpuCoreNum);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                cpuCoreNum,// 核心线程数
                cpuCoreNum*2,// 最大线程数
                60,// 线程存活时间
                TimeUnit.SECONDS,// 线程存活时间的单位
                new LinkedBlockingQueue<>(1024),// 阻塞队列
                Executors.defaultThreadFactory(),//  线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略
        );
        //  返回数据
        return threadPoolExecutor;
    }
}
